iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
佛心分享-SideProject30

從卡關到通關的Spring Boot 腦內風暴系列 第 24

分頁與排序的藝術-Pageable及Sort的實踐

  • 分享至 

  • xImage
  •  

在資料查詢或應用大量數據時,將資料分頁顯示並按照需求排序是常見的,在Spring Boot當中,可透過內建的Pageable以及Sort介面,輕鬆與Spring Data JPA結合,簡化開發過程,快速實現。

使用說明

  • 定義實體類
@Entity
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Date taskDate;
    
    // getters and setters
}
  • 建立Repository
public interface TaskRepository extends JpaRepository<Task, Long> {
}
  • 在控制層或服務層使用Pageable和Sort查詢
@RestController
public class TaskController {

    private final TaskRepository taskRepository;

    public TaskController(TaskRepository taskRepository) {
        this.taskRepository = taskRepository;
    }

    @GetMapping("/tasks")
    public Map<String, Object> getTasks(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size,
            @RequestParam(defaultValue = "name") String sortBy) {

            // 分頁與排序
            Pageable pageable = PageRequest.of(page, size, Sort.by(sortBy));
            Page<Task> tasksPage = taskRepository.findAll(pageable);

            // 取得分頁中的資料
            List<Task> tasks = tasksPage.getContent();
            int totalPages = tasksPage.getTotalPages();
            long totalItems = tasksPage.getTotalElements();
            int currentPage = tasksPage.getNumber();
            
            // 封裝結果到Map,返回JSON格式
            Map<String, Object> response = new HashMap<>();
            response.put("tasks", tasks);               // 當前頁數據
            response.put("currentPage", currentPage);   // 當前頁碼
            response.put("totalItems", totalItems);     // 總條數
            response.put("totalPages", totalPages);     // 總頁數
            // 如果不封裝,Spring Boot會返回所有Page對象相關數據

            return response; // 以JSON格式返回
    }
}

調用tasks API時,返回的JSON格式:

{
    "tasks": [
        {
            "id": 1,
            "name": "Task 1",
            "taskDate": "2024-10-07"
        },
        {
            "id": 2,
            "name": "Task 2",
            "taskDate": "2024-10-08"
        }
    ],
    "currentPage": 0,
    "totalItems": 50,
    "totalPages": 5
}

使用技巧

  • 預設值
    使用 defaultValue 可指定 page、size、sortBy 預設值。

  • 多重排序
    sort可用於多個字段排序,例如:

Sort sort = Sort.by("name").ascending().and(Sort.by("taskDate").descending());
Pageable pageable = PageRequest.of(page, size, sort);
// 可以同時根據名稱升序和日期降序進行排序。

排序分頁功能是來自Spring Data JPA,同樣並非Spring Boot獨有,而是省去繁瑣配置,能快速上手應用,適合多種web場景,同時也能方便前端處理分頁和顯示數據,方便擴展排序或其他過濾條件。


上一篇
全場我Hand住-@ControllerAdvice 與 ExceptionHandler
下一篇
提升效率就靠-Spring Boot 的非同步處理
系列文
從卡關到通關的Spring Boot 腦內風暴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言